/**
 * @file         gb32960_frame_common.h
 * @brief        32960公共部分
 * @note
 * @author       yinyan
 * @date         2023/02/01
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2023/02/01  <td>1.0                   <td>yinyan          <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */

#ifndef __BSC_GB32960_FRAME_COMMON_H__
#define __BSC_GB32960_FRAME_COMMON_H__

#include "gbmsg32960/gb_msg_32960_codec.h"
#include "mfc/mfc_serial_vir_bus.h"
#include "gbmsg32960/gb_msg_32960_mgr.h"
#include "mfc/mfc_mem_codec.h"
#include "bsc_gb32960_frame_channel.h"
#include "gbmsg32960/gb_msg_32960_session_comp.h"

/**
 * 外部上报回调，由应用设置
 * @param param: 用户参数，由注册方规定
 * @param package_buf: 包缓冲区
 * @param buf_size: 包大小
 * @return
 */
typedef void(*TBsGb32960FrameDoExtSend)(void* param, UInt8* package_buf, UInt16 package_size);

/**
 * 设置外部发送回调
 * @param param: 用户参数
 * @param DoExtSend: 回调函数
 * @return
 */
void BsGb32960FrameCommmonSetDoExtSend(void* param, TBsGb32960FrameDoExtSend DoExtSend);

/**
 * 发送32960消息
 * @param msg: 32960消息
 * @param msg_mgr: 消息管理器
 * @param vir_bus: 虚拟总线
 * @note: 发送之前需要设置BsGb32960FrameCommonSetBuffer
 * @return <0 错误码 =0发送成功
 */
Int32 BsGb32960FrameCommmonSend(TGbMsg32960Head *msg, TGbMsg32960Mgr *msg_mgr, TMfSerialVirBus *vir_bus);

/**
 * 设置发送缓存
 * @param buffer1: 缓存1 需大于2100
 * @param buffer1_size: 缓存1大小
 * @param buffer2: 缓存2 需大于2100
 * @param buffer2_size: 缓存2大小
 * @return
 */
void BsGb32960FrameCommonSetBuffer(void *buffer1, UInt16 buffer1_size, void *buffer2, UInt16 buffer2_size);


/**
 * 打包消息头
 * @param head: 消息头
 * @param cmd_id: 消息ID
 * @param msg_len: 消息体长度
 * @param pdu: 消息体
 * @return
 */
Bool BsGb32960FrameCommonPackMsgHead(TGbMsg32960Head *head, UInt16 cmd_id, UInt16 msg_len, void *pdu);

/**
* 设置采集开始时间
* @param time: 设置的时间
* @param msec: 设置的毫秒
* @return
*/
void Gb32960FrameSetStartTime(TTime time, UInt16 msec);

/**
* 增加采集时间
* @param sec: 增加的秒
* @param msec: 增加的毫秒 （忽略1000以上的部分） 
* @return
*/
void Gb32960FrameIncTime(UInt8 sec, UInt16 msec);

/**
* 获取当前上报时间
* @param msec: 毫秒
* @return 时间戳
*/
TTime Gb32960FrameTime(UInt16 *msec);

/**
 *
 */
void BsGb32960FrameCreateBroadcast(void *sender, void *receiver, TGbMsg32960Head *msg_head);

/**
 *
 */
void BsGb32960FrameProcBroadcast(TGbMsg32960 *sender, void *receiver, struct IGbMsg32960SessionTag *session);

/**
 * 接收事件
 */
void BsGb32960FrameChanReceiveEvent(void *sender, const Byte *buf, int size);

/**
 * 发送事件
 */
void BsGb32960FrameChanSendEvent(void *sender, const Byte *buf, int size);

/**
 * 计算字符串长度
 * @param str: 字符串
 * @param n: 最大长度
 * @return
 */
int BsGb32960FrameStrnlen(char *str, int n);
#endif // __GB32960_FRAME_COMMON_H__
